#loading all the necessary libraries
library(gutenbergr)
library(tidytext)
library(tidyverse)
library(readtext)
library(sentimentr)
library(ggiraphExtra)
library(ggplot2)
library(RColorBrewer)
library(scales)
library(plotly)
library(htmlwidgets)
#finding texts by Fitzgerald on gutenberg
fitzgerald_text <- gutenberg_works(author == "Fitzgerald, F. Scott (Francis Scott)")
fitzgerald_text <- fitzgerald_text[-c(2,3), ]
#downloading all the texts found
fitzgerald_download <- fitzgerald_text %>% 
                      gutenberg_download(meta_fields = c("title", "author"))
Determining mirror for Project Gutenberg from http://www.gutenberg.org/robot/harvest
Using mirror http://aleph.gutenberg.org
The_Great_Gatsby <- read_delim("The Great Gatsby_Fitzgerald, F. Scott (Francis Scott)_clean.txt", 
    delim = ".", quote = "\\\"", escape_double = FALSE)
Rows: 41 Columns: 1
── Column specification ───────────────────────────────────────────────────────────────
Delimiter: "."
chr (1): text

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
The_Great_Gatsby <- The_Great_Gatsby %>% mutate(author = "Fitzgerald, F. Scott (Francis Scott)", .after = text) %>% mutate(title = "The Great Gatsby", .before = author)

Tender_is_the_Night <- read_delim("Tender is the Night_Fitzgerald, F. Scott (Francis Scott)_clean.txt", 
    delim = ".", quote = "\\\"", escape_double = FALSE)
Rows: 3346 Columns: 1
── Column specification ───────────────────────────────────────────────────────────────
Delimiter: "."
chr (1): text

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Tender_is_the_Night <- Tender_is_the_Night %>% mutate(author = "Fitzgerald, F. Scott (Francis Scott)", .after = text) %>% mutate(title = "Tender is the Night", .before = author)
fitzgerald_download$gutenberg_id <- NULL
fitzgerald_corpus <- bind_rows(fitzgerald_download, The_Great_Gatsby, Tender_is_the_Night)
Warning: One or more parsing issues, see `problems()` for details
Warning: One or more parsing issues, see `problems()` for details

The_Sun_Also_Rises_Hemingway_Ernest <- read_delim("The Sun Also Rises_Hemingway, Ernest_clean.txt", 
    delim = "\t", quote = "\\\"", escape_double = FALSE, 
    trim_ws = TRUE)
The_Sun_Also_Rises_Hemingway_Ernest <- The_Sun_Also_Rises_Hemingway_Ernest %>% mutate(author = "Hemingway, Earnest", .after = text) %>% mutate(title = "The Sun Also Rises", .before = author)

The_Old_Man_and_the_Sea_Hemingway_Ernest <- read_delim("The Old Man and the Sea_Hemingway, Ernest_clean.txt", 
    delim = ".", quote = "\\\"", escape_double = FALSE)
The_Old_Man_and_the_Sea_Hemingway_Ernest <- The_Old_Man_and_the_Sea_Hemingway_Ernest %>% mutate(author = "Hemingway, Earnest", .after = text) %>% mutate(title = "The Old Man and the Sea", .before = author)

For_Whom_the_Bell_Tolls_Hemingway_Ernest <- read_delim("For Whom the Bell Tolls_Hemingway, Ernest_clean.txt", 
    delim = ".", quote = "\\\"", escape_double = FALSE)
For_Whom_the_Bell_Tolls_Hemingway_Ernest <- For_Whom_the_Bell_Tolls_Hemingway_Ernest %>% mutate(author = "Hemingway, Earnest", .after = text) %>% mutate(title = "For Whom The Bell Tolls", .before = author)

A_Farewell_to_Arms_Hemingway_Ernest <- read_delim("A Farewell to Arms_Hemingway, Ernest_clean.txt", 
    delim = ".", quote = "\\\"", escape_double = FALSE)
A_Farewell_to_Arms_Hemingway_Ernest <- A_Farewell_to_Arms_Hemingway_Ernest %>% mutate(author = "Hemingway, Earnest", .after = text) %>% mutate(title = "A Farewell to Arms", .before = author)

The_Garden_of_Eden_Hemingway <- read_delim("The Garden of Eden_Hemingway_clean.txt", 
    delim = "\t", quote = "\\\"", escape_double = FALSE, 
    trim_ws = TRUE)
The_Garden_of_Eden_Hemingway_Ernest <- The_Garden_of_Eden_Hemingway %>% mutate(author = "Hemingway, Earnest", .after = text) %>% mutate(title = "The Garden of Eden", .before = author)

hemingway_corpus <- bind_rows(The_Sun_Also_Rises_Hemingway_Ernest,The_Old_Man_and_the_Sea_Hemingway_Ernest,For_Whom_the_Bell_Tolls_Hemingway_Ernest,A_Farewell_to_Arms_Hemingway_Ernest,The_Garden_of_Eden_Hemingway_Ernest)
all_authors <- bind_rows(fitzgerald_corpus, hemingway_corpus)
tidy_all_authors <- all_authors %>% unnest_tokens(word, text) %>% anti_join(stop_words)
Joining, by = "word"
#breaking up texts into words
tidy_hemingway <- hemingway_corpus %>% unnest_tokens(word, text) %>% anti_join(stop_words)
Joining, by = "word"
tidy_all_authors <- all_authors %>% unnest_tokens(word, text) %>% anti_join(stop_words)
Joining, by = "word"
nrc_list <- get_sentiments("nrc")
counter <- tidy_hemingway %>% inner_join(nrc_list) %>% count(word, sort = TRUE)
Joining, by = "word"
sentiment_abs_h <- tidy_hemingway %>% inner_join(get_sentiments("nrc") %>% 
                 filter(sentiment %in% c("anger", 
                                         "anticipation", "disgust", "fear", "joy", "sadness", "surprise", "trust"))
    ) %>%
  count(sentiment) %>%
  pivot_wider(names_from = sentiment,
              values_from = n,
              values_fill = 0) %>% mutate(author = "Hemingway")#%>% 
Joining, by = "word"
  #mutate(sentiment = positive - negative)
total_words_hemingway <- NROW(tidy_hemingway)
sentiment_rel_h <- sentiment_abs_h[,-9]/total_words_hemingway
sentiment_rel_h <- sentiment_rel_h*100
sentiment_rel_h <- sentiment_rel_h %>% mutate(author = "Hemingway")
#anger  anticipation    disgust fear    joy sadness surprise    trust
nrc_joy <- get_sentiments("nrc")
#tidy_hemingway %>% inner_join(nrc_list) %>% count(word, sort = TRUE)
sentiment_abs_f <- tidy_fitzgerald %>% inner_join(get_sentiments("nrc") %>% 
                 filter(sentiment %in% c("anger", 
                                         "anticipation", "disgust", "fear", "joy", "sadness", "surprise", "trust"))
    ) %>%
  count(sentiment) %>%
  pivot_wider(names_from = sentiment,
              values_from = n,
              values_fill = 0) %>% mutate(author = "Fitzgerald")
Joining, by = "word"
total_words_fitzgerald <- NROW(tidy_fitzgerald)
sentiment_rel_f <- sentiment_abs_f[,-9]/total_words_fitzgerald
sentiment_rel_f <- sentiment_rel_f*100
sentiment_rel_f <- sentiment_rel_f %>% mutate(author = "Fitzgerald")
sentiment_both <- bind_rows(sentiment_rel_h, sentiment_rel_f)

data_vis_2 <- ggRadar(
  data = sentiment_both,
  mapping = aes(color = author),
  rescale = FALSE,
  interactive = TRUE,
  use.label = TRUE,
  size = 2,
  legend.position = "right"
)
emotion_list <- read_csv("emotion_list.txt")
Rows: 486 Columns: 1
── Column specification ───────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): word

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
emotion_words <- tibble(emotion_list, emotion = TRUE)
hemingway_emotions <- tidy_hemingway %>% left_join(emotion_words)
Joining, by = "word"
fitzgerald_emotions <- tidy_fitzgerald %>% left_join(emotion_words)
Joining, by = "word"
#counting how often female words appeared
#table shows each text and the respective percentage
fitzgerald_emotion_calc <- fitzgerald_emotions %>% group_by(title) %>% count(emotion) %>% mutate(percent = n/sum(n)*100) %>% mutate(author = "F. Scott Fitzgerald")
#counting how often female words appeared
#table shows each text and the respective percentage
hemingway_emotion_calc <- hemingway_emotions %>% group_by(title) %>% count(emotion) %>% mutate(percent = n/sum(n)*100) %>% mutate(author = "Earnest Hemingway")
combined_table <- bind_rows(hemingway_emotion_calc, fitzgerald_emotion_calc) %>% filter(emotion == TRUE)

data_vis_1 <-ggplot(data=combined_table, aes(x=percent, y=title, fill=author, text = paste("% of emotion: ", percent, sep = ""))) +
  geom_bar(stat="identity") + labs(x = "% of emotion detected", 
       y = "All novels", fill = "Author", title = "Emotive content in all novels")
       
data_vis_1_int <- ggplotly(data_vis_1, tooltip = "text")
data_vis_1_int
save(author_table, hemingway_corpus, fitzgerald_corpus, data_vis_1_int, data_vis_2, file = "saved_data.rda")
puretext <- bind_rows(tidy_hemingway[, 3], tidy_fitzgerald[, 3])
purestring <- unlist(puretext)
sad_1 <- paste(unique(str_subset(purestring, "^anger|^angr|^disgust|^contempt|^revuls|^envy|^envi|^jealous|^exaspera|^frustra|^aggrava|^agitat|^annoy|^grouch|^grump|^irrita|^bitter|^dislike|^feroci|^fury|^furi|^hate|^hostil|^loath|^outrage|^rage|^rag|^resent|^scorn|^spite|^venge|^wrath|^torment|^fear|^horr|^alarm|^fright|^hyster|^mortifi|^panic|^shock|^terror|^nervous|^anxi|^apprehen|^distress|^dread|^tense|^uneasi|^uneasy|^worr|^joy|^cheer|^amuse|^bliss|^delight|^ecsta|^elati|^enjoy|^euphor|^gaiety|^glad|^glee|^happi|^jolli|^jolly|^jovial|^jubil|^satisf|^content|^pleasur|^enthrall|^raptur|^eager|^hope|^optimis|^pride|^proud|^triumph|^relie|^zest|^enthusias|^excit|^exhilara|^thrill|^zeal|^love|^ador|^affec|^attrac|^care|^cari|^compassion|^fond|^like|^liking|^sentiment|^tender|^long|^arous|^desire|^infatuat|^lust|^passion|^sad|^disappoint|^dismay|^displeasur|^alien|^defeat|^deject|^embarrass|^homesick|^humiliat|^insecur|^isola|^insult|^lonel|^neglect|^reject|^depress|^despair|^gloom|^glum|^grie|^hopeless|^melancholi|^miser|^sorrow|^unhappi|^woe|^shame|^guilt|^regret|^remorse|^suffer|^agon|^anguish|^hurt|^pity|^piti|^sympath|^surprise|^amaze|^astonish")), collapse = ' ')
LS0tCnRpdGxlOiAiUHJvamVjdCAyIgphdXRob3JzOiAiTmF2ZGVlcCBTaW5naCwgU2hyZXlhIEtob2JyYWdhZGUsIFNhbXJpZGhpIEhvb2RhIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7ciBsb2FkX2xpYnJhcmllc30KI2xvYWRpbmcgYWxsIHRoZSBuZWNlc3NhcnkgbGlicmFyaWVzCmxpYnJhcnkoZ3V0ZW5iZXJncikKbGlicmFyeSh0aWR5dGV4dCkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmVhZHRleHQpCmxpYnJhcnkoc2VudGltZW50cikKbGlicmFyeShnZ2lyYXBoRXh0cmEpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShodG1sd2lkZ2V0cykKYGBgCgpgYGB7ciBndXRlbmJlcmdfZml0emdlcmFsZF93b3Jrc30KI2ZpbmRpbmcgdGV4dHMgYnkgRml0emdlcmFsZCBvbiBndXRlbmJlcmcKZml0emdlcmFsZF90ZXh0IDwtIGd1dGVuYmVyZ193b3JrcyhhdXRob3IgPT0gIkZpdHpnZXJhbGQsIEYuIFNjb3R0IChGcmFuY2lzIFNjb3R0KSIpCmZpdHpnZXJhbGRfdGV4dCA8LSBmaXR6Z2VyYWxkX3RleHRbLWMoMiwzKSwgXQpgYGAKCmBgYHtyIGd1dGVuYmVyZ19maXR6Z2VyYWxkX2Rvd25sb2FkfQojZG93bmxvYWRpbmcgYWxsIHRoZSB0ZXh0cyBmb3VuZApmaXR6Z2VyYWxkX2Rvd25sb2FkIDwtIGZpdHpnZXJhbGRfdGV4dCAlPiUgCiAgICAgICAgICAgICAgICAgICAgICBndXRlbmJlcmdfZG93bmxvYWQobWV0YV9maWVsZHMgPSBjKCJ0aXRsZSIsICJhdXRob3IiKSkKYGBgCmBgYHtyIGltcG9ydF9GaXR6Z2VyYWxkX2Jvb2tzfQpUaGVfR3JlYXRfR2F0c2J5IDwtIHJlYWRfZGVsaW0oIlRoZSBHcmVhdCBHYXRzYnlfRml0emdlcmFsZCwgRi4gU2NvdHQgKEZyYW5jaXMgU2NvdHQpX2NsZWFuLnR4dCIsIAogICAgZGVsaW0gPSAiLiIsIHF1b3RlID0gIlxcXCIiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UpClRoZV9HcmVhdF9HYXRzYnkgPC0gVGhlX0dyZWF0X0dhdHNieSAlPiUgbXV0YXRlKGF1dGhvciA9ICJGaXR6Z2VyYWxkLCBGLiBTY290dCAoRnJhbmNpcyBTY290dCkiLCAuYWZ0ZXIgPSB0ZXh0KSAlPiUgbXV0YXRlKHRpdGxlID0gIlRoZSBHcmVhdCBHYXRzYnkiLCAuYmVmb3JlID0gYXV0aG9yKQoKVGVuZGVyX2lzX3RoZV9OaWdodCA8LSByZWFkX2RlbGltKCJUZW5kZXIgaXMgdGhlIE5pZ2h0X0ZpdHpnZXJhbGQsIEYuIFNjb3R0IChGcmFuY2lzIFNjb3R0KV9jbGVhbi50eHQiLCAKICAgIGRlbGltID0gIi4iLCBxdW90ZSA9ICJcXFwiIiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFKQpUZW5kZXJfaXNfdGhlX05pZ2h0IDwtIFRlbmRlcl9pc190aGVfTmlnaHQgJT4lIG11dGF0ZShhdXRob3IgPSAiRml0emdlcmFsZCwgRi4gU2NvdHQgKEZyYW5jaXMgU2NvdHQpIiwgLmFmdGVyID0gdGV4dCkgJT4lIG11dGF0ZSh0aXRsZSA9ICJUZW5kZXIgaXMgdGhlIE5pZ2h0IiwgLmJlZm9yZSA9IGF1dGhvcikKYGBgCgpgYGB7ciBjcmVhdGVfRml0emdlcmFsZF9jb3JwdXN9CmZpdHpnZXJhbGRfZG93bmxvYWQkZ3V0ZW5iZXJnX2lkIDwtIE5VTEwKZml0emdlcmFsZF9jb3JwdXMgPC0gYmluZF9yb3dzKGZpdHpnZXJhbGRfZG93bmxvYWQsIFRoZV9HcmVhdF9HYXRzYnksIFRlbmRlcl9pc190aGVfTmlnaHQpCmBgYAoKCmBgYHtyIGltcG9ydF9IZW1pbmd3YXlfYm9va3N9CgpUaGVfU3VuX0Fsc29fUmlzZXNfSGVtaW5nd2F5X0VybmVzdCA8LSByZWFkX2RlbGltKCJUaGUgU3VuIEFsc28gUmlzZXNfSGVtaW5nd2F5LCBFcm5lc3RfY2xlYW4udHh0IiwgCiAgICBkZWxpbSA9ICJcdCIsIHF1b3RlID0gIlxcXCIiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIAogICAgdHJpbV93cyA9IFRSVUUpClRoZV9TdW5fQWxzb19SaXNlc19IZW1pbmd3YXlfRXJuZXN0IDwtIFRoZV9TdW5fQWxzb19SaXNlc19IZW1pbmd3YXlfRXJuZXN0ICU+JSBtdXRhdGUoYXV0aG9yID0gIkhlbWluZ3dheSwgRWFybmVzdCIsIC5hZnRlciA9IHRleHQpICU+JSBtdXRhdGUodGl0bGUgPSAiVGhlIFN1biBBbHNvIFJpc2VzIiwgLmJlZm9yZSA9IGF1dGhvcikKClRoZV9PbGRfTWFuX2FuZF90aGVfU2VhX0hlbWluZ3dheV9Fcm5lc3QgPC0gcmVhZF9kZWxpbSgiVGhlIE9sZCBNYW4gYW5kIHRoZSBTZWFfSGVtaW5nd2F5LCBFcm5lc3RfY2xlYW4udHh0IiwgCiAgICBkZWxpbSA9ICIuIiwgcXVvdGUgPSAiXFxcIiIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSkKVGhlX09sZF9NYW5fYW5kX3RoZV9TZWFfSGVtaW5nd2F5X0VybmVzdCA8LSBUaGVfT2xkX01hbl9hbmRfdGhlX1NlYV9IZW1pbmd3YXlfRXJuZXN0ICU+JSBtdXRhdGUoYXV0aG9yID0gIkhlbWluZ3dheSwgRWFybmVzdCIsIC5hZnRlciA9IHRleHQpICU+JSBtdXRhdGUodGl0bGUgPSAiVGhlIE9sZCBNYW4gYW5kIHRoZSBTZWEiLCAuYmVmb3JlID0gYXV0aG9yKQoKRm9yX1dob21fdGhlX0JlbGxfVG9sbHNfSGVtaW5nd2F5X0VybmVzdCA8LSByZWFkX2RlbGltKCJGb3IgV2hvbSB0aGUgQmVsbCBUb2xsc19IZW1pbmd3YXksIEVybmVzdF9jbGVhbi50eHQiLCAKICAgIGRlbGltID0gIi4iLCBxdW90ZSA9ICJcXFwiIiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFKQpGb3JfV2hvbV90aGVfQmVsbF9Ub2xsc19IZW1pbmd3YXlfRXJuZXN0IDwtIEZvcl9XaG9tX3RoZV9CZWxsX1RvbGxzX0hlbWluZ3dheV9Fcm5lc3QgJT4lIG11dGF0ZShhdXRob3IgPSAiSGVtaW5nd2F5LCBFYXJuZXN0IiwgLmFmdGVyID0gdGV4dCkgJT4lIG11dGF0ZSh0aXRsZSA9ICJGb3IgV2hvbSBUaGUgQmVsbCBUb2xscyIsIC5iZWZvcmUgPSBhdXRob3IpCgpBX0ZhcmV3ZWxsX3RvX0FybXNfSGVtaW5nd2F5X0VybmVzdCA8LSByZWFkX2RlbGltKCJBIEZhcmV3ZWxsIHRvIEFybXNfSGVtaW5nd2F5LCBFcm5lc3RfY2xlYW4udHh0IiwgCiAgICBkZWxpbSA9ICIuIiwgcXVvdGUgPSAiXFxcIiIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSkKQV9GYXJld2VsbF90b19Bcm1zX0hlbWluZ3dheV9Fcm5lc3QgPC0gQV9GYXJld2VsbF90b19Bcm1zX0hlbWluZ3dheV9Fcm5lc3QgJT4lIG11dGF0ZShhdXRob3IgPSAiSGVtaW5nd2F5LCBFYXJuZXN0IiwgLmFmdGVyID0gdGV4dCkgJT4lIG11dGF0ZSh0aXRsZSA9ICJBIEZhcmV3ZWxsIHRvIEFybXMiLCAuYmVmb3JlID0gYXV0aG9yKQoKVGhlX0dhcmRlbl9vZl9FZGVuX0hlbWluZ3dheSA8LSByZWFkX2RlbGltKCJUaGUgR2FyZGVuIG9mIEVkZW5fSGVtaW5nd2F5X2NsZWFuLnR4dCIsIAogICAgZGVsaW0gPSAiXHQiLCBxdW90ZSA9ICJcXFwiIiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCAKICAgIHRyaW1fd3MgPSBUUlVFKQpUaGVfR2FyZGVuX29mX0VkZW5fSGVtaW5nd2F5X0VybmVzdCA8LSBUaGVfR2FyZGVuX29mX0VkZW5fSGVtaW5nd2F5ICU+JSBtdXRhdGUoYXV0aG9yID0gIkhlbWluZ3dheSwgRWFybmVzdCIsIC5hZnRlciA9IHRleHQpICU+JSBtdXRhdGUodGl0bGUgPSAiVGhlIEdhcmRlbiBvZiBFZGVuIiwgLmJlZm9yZSA9IGF1dGhvcikKCmhlbWluZ3dheV9jb3JwdXMgPC0gYmluZF9yb3dzKFRoZV9TdW5fQWxzb19SaXNlc19IZW1pbmd3YXlfRXJuZXN0LFRoZV9PbGRfTWFuX2FuZF90aGVfU2VhX0hlbWluZ3dheV9Fcm5lc3QsRm9yX1dob21fdGhlX0JlbGxfVG9sbHNfSGVtaW5nd2F5X0VybmVzdCxBX0ZhcmV3ZWxsX3RvX0FybXNfSGVtaW5nd2F5X0VybmVzdCxUaGVfR2FyZGVuX29mX0VkZW5fSGVtaW5nd2F5X0VybmVzdCkKYGBgCgpgYGB7ciBhbGxfYXV0aG9yc30KYWxsX2F1dGhvcnMgPC0gYmluZF9yb3dzKGZpdHpnZXJhbGRfY29ycHVzLCBoZW1pbmd3YXlfY29ycHVzKQoKYGBgCgpgYGB7ciB0aWR5X2FsbF9hdXRob3JzfQp0aWR5X2FsbF9hdXRob3JzIDwtIGFsbF9hdXRob3JzICU+JSB1bm5lc3RfdG9rZW5zKHdvcmQsIHRleHQpICU+JSBhbnRpX2pvaW4oc3RvcF93b3JkcykKYGBgCgoKYGBge3IgdGlkeV9oZW1pbmd3YXl9CiNicmVha2luZyB1cCB0ZXh0cyBpbnRvIHdvcmRzCnRpZHlfaGVtaW5nd2F5IDwtIGhlbWluZ3dheV9jb3JwdXMgJT4lIHVubmVzdF90b2tlbnMod29yZCwgdGV4dCkgJT4lIGFudGlfam9pbihzdG9wX3dvcmRzKQpgYGAKCmBgYHtyIHRpZHlfZml0emdlcmFsZH0KI2JyZWFraW5nIHVwIHRleHRzIGludG8gd29yZHMKdGlkeV9maXR6Z2VyYWxkIDwtIGZpdHpnZXJhbGRfY29ycHVzICU+JSB1bm5lc3RfdG9rZW5zKHdvcmQsIHRleHQpICU+JSBhbnRpX2pvaW4oc3RvcF93b3JkcykKYGBgCgpgYGB7ciBzZW50aW1lbnRfbnJjfQpucmNfbGlzdCA8LSBnZXRfc2VudGltZW50cygibnJjIikKY291bnRlciA8LSB0aWR5X2hlbWluZ3dheSAlPiUgaW5uZXJfam9pbihucmNfbGlzdCkgJT4lIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKQpzZW50aW1lbnRfYWJzX2ggPC0gdGlkeV9oZW1pbmd3YXkgJT4lIGlubmVyX2pvaW4oZ2V0X3NlbnRpbWVudHMoIm5yYyIpICU+JSAKICAgICAgICAgICAgICAgICBmaWx0ZXIoc2VudGltZW50ICVpbiUgYygiYW5nZXIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW50aWNpcGF0aW9uIiwgImRpc2d1c3QiLCAiZmVhciIsICJqb3kiLCAic2FkbmVzcyIsICJzdXJwcmlzZSIsICJ0cnVzdCIpKQogICAgKSAlPiUKICBjb3VudChzZW50aW1lbnQpICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBzZW50aW1lbnQsCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBuLAogICAgICAgICAgICAgIHZhbHVlc19maWxsID0gMCkgJT4lIG11dGF0ZShhdXRob3IgPSAiSGVtaW5nd2F5IikjJT4lIAogICNtdXRhdGUoc2VudGltZW50ID0gcG9zaXRpdmUgLSBuZWdhdGl2ZSkKdG90YWxfd29yZHNfaGVtaW5nd2F5IDwtIE5ST1codGlkeV9oZW1pbmd3YXkpCnNlbnRpbWVudF9yZWxfaCA8LSBzZW50aW1lbnRfYWJzX2hbLC05XS90b3RhbF93b3Jkc19oZW1pbmd3YXkKc2VudGltZW50X3JlbF9oIDwtIHNlbnRpbWVudF9yZWxfaCoxMDAKc2VudGltZW50X3JlbF9oIDwtIHNlbnRpbWVudF9yZWxfaCAlPiUgbXV0YXRlKGF1dGhvciA9ICJIZW1pbmd3YXkiKQojYW5nZXIJYW50aWNpcGF0aW9uCWRpc2d1c3QJZmVhcglqb3kJc2FkbmVzcwlzdXJwcmlzZQl0cnVzdApgYGAKCmBgYHtyfQpucmNfam95IDwtIGdldF9zZW50aW1lbnRzKCJucmMiKQojdGlkeV9oZW1pbmd3YXkgJT4lIGlubmVyX2pvaW4obnJjX2xpc3QpICU+JSBjb3VudCh3b3JkLCBzb3J0ID0gVFJVRSkKc2VudGltZW50X2Fic19mIDwtIHRpZHlfZml0emdlcmFsZCAlPiUgaW5uZXJfam9pbihnZXRfc2VudGltZW50cygibnJjIikgJT4lIAogICAgICAgICAgICAgICAgIGZpbHRlcihzZW50aW1lbnQgJWluJSBjKCJhbmdlciIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbnRpY2lwYXRpb24iLCAiZGlzZ3VzdCIsICJmZWFyIiwgImpveSIsICJzYWRuZXNzIiwgInN1cnByaXNlIiwgInRydXN0IikpCiAgICApICU+JQogIGNvdW50KHNlbnRpbWVudCkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHNlbnRpbWVudCwKICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IG4sCiAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSAwKSAlPiUgbXV0YXRlKGF1dGhvciA9ICJGaXR6Z2VyYWxkIikKCnRvdGFsX3dvcmRzX2ZpdHpnZXJhbGQgPC0gTlJPVyh0aWR5X2ZpdHpnZXJhbGQpCnNlbnRpbWVudF9yZWxfZiA8LSBzZW50aW1lbnRfYWJzX2ZbLC05XS90b3RhbF93b3Jkc19maXR6Z2VyYWxkCnNlbnRpbWVudF9yZWxfZiA8LSBzZW50aW1lbnRfcmVsX2YqMTAwCnNlbnRpbWVudF9yZWxfZiA8LSBzZW50aW1lbnRfcmVsX2YgJT4lIG11dGF0ZShhdXRob3IgPSAiRml0emdlcmFsZCIpCmBgYAoKYGBge3J9CnNlbnRpbWVudF9ib3RoIDwtIGJpbmRfcm93cyhzZW50aW1lbnRfcmVsX2gsIHNlbnRpbWVudF9yZWxfZikKCmRhdGFfdmlzXzIgPC0gZ2dSYWRhcigKICBkYXRhID0gc2VudGltZW50X2JvdGgsCiAgbWFwcGluZyA9IGFlcyhjb2xvciA9IGF1dGhvciksCiAgcmVzY2FsZSA9IEZBTFNFLAogIGludGVyYWN0aXZlID0gVFJVRSwKICB1c2UubGFiZWwgPSBUUlVFLAogIHNpemUgPSAyLAogIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIKKQpgYGAKCmBgYHtyIGVtb3Rpb25fd29yZHN9CmVtb3Rpb25fbGlzdCA8LSByZWFkX2NzdigiZW1vdGlvbl9saXN0LnR4dCIpCmVtb3Rpb25fd29yZHMgPC0gdGliYmxlKGVtb3Rpb25fbGlzdCwgZW1vdGlvbiA9IFRSVUUpCmBgYAoKYGBge3IgaGVtaW5nd2F5X2Vtb3Rpb25zfQpoZW1pbmd3YXlfZW1vdGlvbnMgPC0gdGlkeV9oZW1pbmd3YXkgJT4lIGxlZnRfam9pbihlbW90aW9uX3dvcmRzKQpgYGAKCmBgYHtyIGZpdHpnZXJhbGRfZW1vdGlvbnN9CmZpdHpnZXJhbGRfZW1vdGlvbnMgPC0gdGlkeV9maXR6Z2VyYWxkICU+JSBsZWZ0X2pvaW4oZW1vdGlvbl93b3JkcykKYGBgCgpgYGB7ciBmaXR6Z2VyYWxkX2Vtb3Rpb25fdGFibGV9CiNjb3VudGluZyBob3cgb2Z0ZW4gZmVtYWxlIHdvcmRzIGFwcGVhcmVkCiN0YWJsZSBzaG93cyBlYWNoIHRleHQgYW5kIHRoZSByZXNwZWN0aXZlIHBlcmNlbnRhZ2UKZml0emdlcmFsZF9lbW90aW9uX2NhbGMgPC0gZml0emdlcmFsZF9lbW90aW9ucyAlPiUgZ3JvdXBfYnkodGl0bGUpICU+JSBjb3VudChlbW90aW9uKSAlPiUgbXV0YXRlKHBlcmNlbnQgPSBuL3N1bShuKSoxMDApICU+JSBtdXRhdGUoYXV0aG9yID0gIkYuIFNjb3R0IEZpdHpnZXJhbGQiKQoKYGBgCgpgYGB7ciBoZW1pbmd3YXlfZW1vdGlvbl90YWJsZX0KI2NvdW50aW5nIGhvdyBvZnRlbiBmZW1hbGUgd29yZHMgYXBwZWFyZWQKI3RhYmxlIHNob3dzIGVhY2ggdGV4dCBhbmQgdGhlIHJlc3BlY3RpdmUgcGVyY2VudGFnZQpoZW1pbmd3YXlfZW1vdGlvbl9jYWxjIDwtIGhlbWluZ3dheV9lbW90aW9ucyAlPiUgZ3JvdXBfYnkodGl0bGUpICU+JSBjb3VudChlbW90aW9uKSAlPiUgbXV0YXRlKHBlcmNlbnQgPSBuL3N1bShuKSoxMDApICU+JSBtdXRhdGUoYXV0aG9yID0gIkVhcm5lc3QgSGVtaW5nd2F5IikKCmBgYAoKYGBge3IgZW1vdGlvbl9wbG90fQpjb21iaW5lZF90YWJsZSA8LSBiaW5kX3Jvd3MoaGVtaW5nd2F5X2Vtb3Rpb25fY2FsYywgZml0emdlcmFsZF9lbW90aW9uX2NhbGMpICU+JSBmaWx0ZXIoZW1vdGlvbiA9PSBUUlVFKQoKZGF0YV92aXNfMSA8LWdncGxvdChkYXRhPWNvbWJpbmVkX3RhYmxlLCBhZXMoeD1wZXJjZW50LCB5PXRpdGxlLCBmaWxsPWF1dGhvciwgdGV4dCA9IHBhc3RlKCIlIG9mIGVtb3Rpb246ICIsIHBlcmNlbnQsIHNlcCA9ICIiKSkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsgbGFicyh4ID0gIiUgb2YgZW1vdGlvbiBkZXRlY3RlZCIsIAogICAgICAgeSA9ICJBbGwgbm92ZWxzIiwgZmlsbCA9ICJBdXRob3IiLCB0aXRsZSA9ICJFbW90aXZlIGNvbnRlbnQgaW4gYWxsIG5vdmVscyIpCiAgICAgICAKZGF0YV92aXNfMV9pbnQgPC0gZ2dwbG90bHkoZGF0YV92aXNfMSwgdG9vbHRpcCA9ICJ0ZXh0IikKZGF0YV92aXNfMV9pbnQKYGBgCgpgYGB7ciBleHBvcnRpbmdfdGFibGVzfQpzYXZlKGF1dGhvcl90YWJsZSwgaGVtaW5nd2F5X2NvcnB1cywgZml0emdlcmFsZF9jb3JwdXMsIGRhdGFfdmlzXzFfaW50LCBkYXRhX3Zpc18yLCBmaWxlID0gInNhdmVkX2RhdGEucmRhIikKYGBgCgoKCmBgYHtyIHdpbGRjYXJkfQpwdXJldGV4dCA8LSBiaW5kX3Jvd3ModGlkeV9oZW1pbmd3YXlbLCAzXSwgdGlkeV9maXR6Z2VyYWxkWywgM10pCnB1cmVzdHJpbmcgPC0gdW5saXN0KHB1cmV0ZXh0KQpzYWRfMSA8LSBwYXN0ZSh1bmlxdWUoc3RyX3N1YnNldChwdXJlc3RyaW5nLCAiXmFuZ2VyfF5hbmdyfF5kaXNndXN0fF5jb250ZW1wdHxecmV2dWxzfF5lbnZ5fF5lbnZpfF5qZWFsb3VzfF5leGFzcGVyYXxeZnJ1c3RyYXxeYWdncmF2YXxeYWdpdGF0fF5hbm5veXxeZ3JvdWNofF5ncnVtcHxeaXJyaXRhfF5iaXR0ZXJ8XmRpc2xpa2V8XmZlcm9jaXxeZnVyeXxeZnVyaXxeaGF0ZXxeaG9zdGlsfF5sb2F0aHxeb3V0cmFnZXxecmFnZXxecmFnfF5yZXNlbnR8XnNjb3JufF5zcGl0ZXxedmVuZ2V8XndyYXRofF50b3JtZW50fF5mZWFyfF5ob3JyfF5hbGFybXxeZnJpZ2h0fF5oeXN0ZXJ8Xm1vcnRpZml8XnBhbmljfF5zaG9ja3xedGVycm9yfF5uZXJ2b3VzfF5hbnhpfF5hcHByZWhlbnxeZGlzdHJlc3N8XmRyZWFkfF50ZW5zZXxedW5lYXNpfF51bmVhc3l8XndvcnJ8XmpveXxeY2hlZXJ8XmFtdXNlfF5ibGlzc3xeZGVsaWdodHxeZWNzdGF8XmVsYXRpfF5lbmpveXxeZXVwaG9yfF5nYWlldHl8XmdsYWR8XmdsZWV8XmhhcHBpfF5qb2xsaXxeam9sbHl8XmpvdmlhbHxeanViaWx8XnNhdGlzZnxeY29udGVudHxecGxlYXN1cnxeZW50aHJhbGx8XnJhcHR1cnxeZWFnZXJ8XmhvcGV8Xm9wdGltaXN8XnByaWRlfF5wcm91ZHxedHJpdW1waHxecmVsaWV8Xnplc3R8XmVudGh1c2lhc3xeZXhjaXR8XmV4aGlsYXJhfF50aHJpbGx8XnplYWx8XmxvdmV8XmFkb3J8XmFmZmVjfF5hdHRyYWN8XmNhcmV8XmNhcml8XmNvbXBhc3Npb258XmZvbmR8Xmxpa2V8Xmxpa2luZ3xec2VudGltZW50fF50ZW5kZXJ8Xmxvbmd8XmFyb3VzfF5kZXNpcmV8XmluZmF0dWF0fF5sdXN0fF5wYXNzaW9ufF5zYWR8XmRpc2FwcG9pbnR8XmRpc21heXxeZGlzcGxlYXN1cnxeYWxpZW58XmRlZmVhdHxeZGVqZWN0fF5lbWJhcnJhc3N8XmhvbWVzaWNrfF5odW1pbGlhdHxeaW5zZWN1cnxeaXNvbGF8Xmluc3VsdHxebG9uZWx8Xm5lZ2xlY3R8XnJlamVjdHxeZGVwcmVzc3xeZGVzcGFpcnxeZ2xvb218XmdsdW18XmdyaWV8XmhvcGVsZXNzfF5tZWxhbmNob2xpfF5taXNlcnxec29ycm93fF51bmhhcHBpfF53b2V8XnNoYW1lfF5ndWlsdHxecmVncmV0fF5yZW1vcnNlfF5zdWZmZXJ8XmFnb258XmFuZ3Vpc2h8Xmh1cnR8XnBpdHl8XnBpdGl8XnN5bXBhdGh8XnN1cnByaXNlfF5hbWF6ZXxeYXN0b25pc2giKSksIGNvbGxhcHNlID0gJyAnKQpgYGA=